using System;
using Csla;
using Ent.AccesoDatos;
using System.Collections.Generic;
using System.Data;

namespace EntGuayasSLA.BL
{
    [Serializable]
    public class DocumentoAdicional : BusinessBase<DocumentoAdicional>
    {
        #region Business Methods
        //DOA_ID    
        public static readonly PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(c => c.Id);
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }
        public static readonly PropertyInfo<string> IdModuloProperty = RegisterProperty<string>(c => c.IdModulo);
        public string IdModulo
        {
            get { return GetProperty(IdModuloProperty); }
            set { SetProperty(IdModuloProperty, value); }
        }
        //FAL_ID 
        public static readonly PropertyInfo<string> FaseAuditoriaCumplimientoProperty = RegisterProperty<string>(c => c.FaseAuditoriaCumplimiento);
        public string FaseAuditoriaCumplimiento
        {
            get { return GetProperty(FaseAuditoriaCumplimientoProperty); }
            set { SetProperty(FaseAuditoriaCumplimientoProperty, value); }
        }      
        //FAC_ID 
        public static readonly PropertyInfo<string> FaseLicenciamientoProperty = RegisterProperty<string>(c => c.FaseLicenciamiento);
        public string FaseLicenciamiento
        {
            get { return GetProperty(FaseLicenciamientoProperty); }
            set { SetProperty(FaseLicenciamientoProperty, value); }
        }      
        //CPM_ID
        public static readonly PropertyInfo<string> PmaProperty = RegisterProperty<string>(c => c.Pma);
        public string Pma
        {
            get { return GetProperty(PmaProperty); }
            set { SetProperty(PmaProperty, value); }
        }         
        //OTR_ID 
        public static readonly PropertyInfo<string> OtroIdProperty = RegisterProperty<string>(c => c.OtroId);
        public string OtroId
        {
            get { return GetProperty(OtroIdProperty); }
            set { SetProperty(OtroIdProperty, value); }
        }      
        //MON_ID  
        public static readonly PropertyInfo<string> MonitoreoProperty = RegisterProperty<string>(c => c.Monitoreo);
        public string Monitoreo
        {
            get { return GetProperty(MonitoreoProperty); }
            set { SetProperty(MonitoreoProperty, value); }
        } 
        //DOA_FORMATO 
        public static readonly PropertyInfo<string> FormatoProperty = RegisterProperty<string>(c => c.Formato);
        public string Formato
        {
            get { return GetProperty(FormatoProperty); }
            set { SetProperty(FormatoProperty, value); }
        }
        //DOA_FECHA
        public static readonly PropertyInfo<DateTime> FechaProperty = RegisterProperty<DateTime>(c => c.Fecha);
        public DateTime Fecha
        {
            get { return GetProperty(FechaProperty); }
            set { SetProperty(FechaProperty, value); }
        }   
        //DOA_OBLIGATORIO   
        public static readonly PropertyInfo<string> ObligatorioProperty = RegisterProperty<string>(c => c.Obligatorio);
        public string Obligatorio
        {
            get { return GetProperty(ObligatorioProperty); }
            set { SetProperty(ObligatorioProperty, value); }
        }
        //DOA_TABLA  
        public static readonly PropertyInfo<string> ModuloProperty = RegisterProperty<string>(c => c.Modulo);
        public string Modulo
        {
            get { return GetProperty(ModuloProperty); }
            set { SetProperty(ModuloProperty, value); }
        }           
        //DOA_NOMBRE           
        public static readonly PropertyInfo<string> NombreProperty = RegisterProperty<string>(c => c.Nombre);
        public string Nombre
        {
            get { return GetProperty(NombreProperty); }
            set { SetProperty(NombreProperty, value); }
        }       
        #endregion

        #region Business Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            base.AddBusinessRules();
            //BusinessRules.AddRule(new Rule(IdProperty));
        }

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //BusinessRules.AddRule(...);
        }

        #endregion

        #region Factory Methods

        public static DocumentoAdicional NewEditableRoot()
        {
            return DataPortal.Create<DocumentoAdicional>();
        }

        public static DocumentoAdicional GetEditableRoot(Guid id)
        {
            return DataPortal.Fetch<DocumentoAdicional>(id);
        }

        public static void DeleteEditableRoot(int id)
        {
            DataPortal.Delete<DocumentoAdicional>(id);
        }

        private DocumentoAdicional()
        { /* Require use of factory methods */ }

        #endregion

        #region Data Access

        [RunLocal]
        protected override void DataPortal_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.DataPortal_Create();
        }

        private void DataPortal_Fetch(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { new Parametro("ec_doa_id", criteria.ToString()) };
            DataSet datos = accesoDatos.EjecutarDataSet("\"OBT_DOCUMENTO_ADD\"", parametros);
            if (datos.Tables[0].Rows.Count > 0)
            {
                //                                      
                LoadProperty(IdProperty, Guid.Parse(datos.Tables[0].Rows[0]["doa_id"].ToString()));
                LoadProperty(FaseAuditoriaCumplimientoProperty, datos.Tables[0].Rows[0]["fal_id"].ToString());
                LoadProperty(FaseLicenciamientoProperty, datos.Tables[0].Rows[0]["fac_id"].ToString());
                LoadProperty(PmaProperty, datos.Tables[0].Rows[0]["cpm_id"].ToString());
                LoadProperty(OtroIdProperty, datos.Tables[0].Rows[0]["otr_id"].ToString());
                LoadProperty(MonitoreoProperty, datos.Tables[0].Rows[0]["mon_id"].ToString());
                LoadProperty(FormatoProperty, datos.Tables[0].Rows[0]["doa_formato"].ToString());
                LoadProperty(FechaProperty,Convert.ToDateTime(datos.Tables[0].Rows[0]["doa_fecha"].ToString()));
                LoadProperty(ObligatorioProperty, datos.Tables[0].Rows[0]["doa_obligatorio"].ToString());
                LoadProperty(ModuloProperty, datos.Tables[0].Rows[0]["doa_tabla"].ToString());
                LoadProperty(NombreProperty, datos.Tables[0].Rows[0]["doa_nombre"].ToString());
            }
        }
       
        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        { 
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_doa_id", ReadProperty(IdProperty)),
                new Parametro("ec_id", ReadProperty(IdModuloProperty)),                
                new Parametro("ec_doa_formato", ReadProperty(FormatoProperty)),              
                new Parametro("ec_doa_obligatorio", ReadProperty(ObligatorioProperty)),
                new Parametro("ec_doa_tabla", ReadProperty(ModuloProperty)),
                new Parametro("ec_doa_nombre ", ReadProperty(NombreProperty))
            };
            accesoDatos.EjecutarQuery("\"INS_DOCUMENTO_ADD\"", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_doa_id", ReadProperty(IdProperty)),
                new Parametro("ec_doa_formato", ReadProperty(FormatoProperty)),
                new Parametro("ef_doa_fecha", ReadProperty(FechaProperty)),
                new Parametro("ec_doa_obligatorio", ReadProperty(ObligatorioProperty)),
                new Parametro("ec_doa_tabla", ReadProperty(ModuloProperty)),
                new Parametro("ec_doa_nombre ", ReadProperty(NombreProperty))
            };
            accesoDatos.EjecutarQuery("\"ACT_DOCUMENTO_ADD\"", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            DataPortal_Delete(this.Id);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_doa_id", ReadProperty(IdProperty))
            };
            accesoDatos.EjecutarQuery("\"ELI_DOCUMENTO_ADD\"", parametros);
        }

        #endregion
    }
}
